#include "IPC_Queue.h"

#if 0
    struct msqid_ds ds;
    if (msgctl(msqid, IPC_STAT, &ds) == -1) { // 获取消息队列状态
        perror("msgctl");
        exit(EXIT_FAILURE);
    }
 
    ds.msg_qbytes = 10240; // 设置消息队列的缓冲区大小为10KB
 
    if (msgctl(msqid, IPC_SET, &ds) == -1) { // 设置消息队列的缓冲区大小
        perror("msgctl");
        exit(EXIT_FAILURE);
    }

#endif
int    IPC_QueueInit(int key)
{
    int msgid = -1;
    msgid = msgget(key, 0666);
    if(msgid >= 0)
    {
       return msgid;
    }

    msgid = msgget(key, IPC_CREAT | 0666);
    if (msgid < 0)
    {
        COMLOG_ERROR_LOG("msgget error");
        return -1;
    }
    return msgid;
}



int    IPC_QueueDeinit(int msgid)
{
     msgctl(msgid, IPC_RMID, NULL);
     return 0;
}   


int    IPC_QueueRead(int msgid, int type, char *buffer, int len)
{
    MSGBUF msg = {0};
    if(buffer == NULL)
       return -1;
    //获取长度不包含消息类型
    int ret = msgrcv(msgid, &msg, sizeof(MSGBUF) - sizeof(long), type, IPC_NOWAIT); 
    if (ret < 0)
    {
        return -1;
    }
    
    if(len > msg.count)
       memcpy(buffer, msg.buf, msg.count);
    else
       memcpy(buffer, msg.buf, len);
    return 0;
}


int    IPC_QueueWrite(int msgid,  int type, char *buffer, int len)
{
     int ret = -1;
     MSGBUF msg = {0};
     if(buffer == NULL)
       return -1;   
     if(len > sizeof(msg.buf))  
       return -1;
     msg.type = type;
     msg.count = len;
     memcpy(msg.buf, buffer, len);
     //发送的消息长度不包含消息类型
     ret = msgsnd(msgid, &msg, len + sizeof(msg.count), IPC_NOWAIT); 
     if (ret < 0)
     {
        return -1;
     }
     return 0;
}
